package com.duck.communication.service.impl;

import com.duck.common.domain.PagerPojo;
import com.duck.communication.dao.CommentDao;
import com.duck.communication.domain.dto.GetCommentDto;
import com.duck.communication.domain.vo.GetCommentVo;
import com.duck.communication.service.CommentService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;

@Service
public class CommentServiceImpl implements CommentService {

    @Autowired
    private CommentDao commentDao;

    @Override
    public Integer addComment(HashMap<String,Object> comment) {
        return commentDao.addComment(comment);
    }

    @Override
    public PagerPojo<GetCommentVo> getComment(GetCommentDto getCommentDto) {
        // 开启分页查询 PageHelper
        PageHelper.startPage(getCommentDto.getPage(), getCommentDto.getSize());
        // 查所有的根评论
        List<GetCommentVo> commentsVOList = commentDao.getAllRoot(getCommentDto);
        // 遍历commentsVOList列表，添加对应的子评论（二级评论在一级评论的children字段中，三级评论在二级评论的children字段中，以此类推）
        for (GetCommentVo comment : commentsVOList) {
            // 调用查询子评论的方法，需要该顶级评论自己的 id 与 关联主体 id
            comment.setChildren(getChildrenComments(comment.getCommentId(), getCommentDto.getPostId()));
        }
        Page<GetCommentVo> page = (Page<GetCommentVo>) commentsVOList;
        return new PagerPojo<>(page.getTotal(), page.getResult());
    }

    @Override
    public Integer commentCount(String postId) {
        return commentDao.commentCount(postId);
    }

    /**
     * 获取子评论
     * @param parentId 直接父级评论
     * @param postId 关联帖子ID
     * @return 子评论
     */
    private List<GetCommentVo> getChildrenComments(String parentId, String postId) {
        // 查询当前 parentId 的直接子评论
        // （需要的是该子评论的直接父评论ID，一开始从二级评论开始查，也就是调用此方法时传进来的顶级评论id[这就是二级评论的直接父评论ID]；还有关联主体id）
        List<GetCommentVo> commentsVOList = commentDao.getChildren(parentId, postId);
        // 遍历名为commentsVOList的CommentsVO类型的集合
        for (GetCommentVo comment : commentsVOList) {
            // 此处用到了递归，对每个子评论继续查询它们的子评论，每次调用本层的id去查子一层
            // 【注意】每一个子孩子还有子孩子的话，也是按照CommentsVO类型来存放
            comment.setChildren(getChildrenComments(comment.getCommentId(), postId));
        }
        return commentsVOList;
    }
}
